适用于版本0.10.1。
以下步骤在经过MacBook测试。
1 准备
硬件
执行Spark SQL查询需要至少6GB内存和4个CPU核心
Docker环境
kcat
从命令行生产消费kafka主题的工具
/etc/hosts
映射容器服务
1
2
3
4
5
6
7
8
9127.0.0.1 adhoc-1
127.0.0.1 adhoc-2
127.0.0.1 namenode
127.0.0.1 datanode1
127.0.0.1 hiveserver
127.0.0.1 hivemetastore
127.0.0.1 kafkabroker
127.0.0.1 sparkmaster
127.0.0.1 zookeeperJDK 8
Maven
jq
用于命令行处理json
2 部署Docker集群
(1) 编译Hudi
当前默认使用Scala 2.11
1 | cd <HUDI_WORKSPACE> |
(2) 启动集群
执行docker compose脚本并配置
1 | $ cd docker |
至此,以下服务准备就绪:
- HDFS(包含命名节点和数据节点)
- Spark主从节点
- Hive服务(包含Metastore、PostgresDB支持的HiveServer2)
- Kafka Broker(作为输入源)和一个ZooKeeper节点
- Presto主从节点
- Trino主从节点
- Hive with Hudi命令行即时查询容器
3 示例
示例数据为股票追踪数据,按照分钟粒度呈现,存放在docer/demo/data下。其中包含两批数据,第一批早9点半到10点半,第二批早10点半到11点,两批之间存在数据交叉。
(1) 发布首批数据到kafka
上传第一批数据到stock ticks
主题中。
1 | # 上传数据 |
(2) 从kafka主题中增量消费数据
DeltaStreamer可以连接多种数据源(包含kafka),并且应用变化到Hudi表中。
此处使用DeltaStreamer从kafka主题中下载json数据并初始化Hudi COW/MOR表。
1 | docker exec -it adhoc-2 /bin/bash |
可以通过HDFS浏览器查看创建的表,如http://namenode:50070/explorer.html#/user/hive/warehouse/stock_ticks_cow
分区文件夹中,.hoodie下的commit或deltacommit文件标志提交成功
(3) 同步Hive
至此HDFS上的表文件已经准备就绪,需要创建Hive表以执行Hive查询。
1 | docker exec -it adhoc-2 /bin/bash |
(4) 查询
1) Hive查询
查询股票代码GOOG最近的数据时间戳。由于Hudi为首批数据创建的是parquet文件,因此RO表和RT表查询结果一致。
1 | docker exec -it adhoc-2 /bin/bash |
2) Spark SQL查询
1 | docker exec -it adhoc-1 /bin/bash |
3) Presto查询
1 | docker exec -it presto-worker-1 presto --server presto-coordinator-1:8090 |
4) Trino查询
略
(5) 上传第二批数据并使用Delta Streamer消费
上传第二批数据。由于没有创建新的分区,因此无需同步Hive。
1 | cat docker/demo/data/batch_2.json | kcat -b kafkabroker -t stock_ticks -P |
(6) 查询
第二次提交,对于COW表将产生新的parquet文件,而对于MOR表只是追加到log变化文件中。
因此MOR表读优化由于只读区parquet文件,将不会反应最新变化,而快照读可以。
1) Hive查询
1 | docker exec -it adhoc-2 /bin/bash |
2) Spark SQL查询
1 | docker exec -it adhoc-1 /bin/bash |
3) Presto查询
1 | docker exec -it presto-worker-1 presto --server presto-coordinator-1:8090 |
4) Trino查询
略
(7) 增量查询
1) Hive
1 | docker exec -it adhoc-2 /bin/bash |
2) Spark Shell
1 | docker exec -it adhoc-1 /bin/bash |
(8) 调度并对MOR表压缩
使用Hudi CLI调度并压缩
1 | docker exec -it adhoc-1 /bin/bash |
(9) Hive查询(包含增量数据)
1 | docker exec -it adhoc-2 /bin/bash |
(10) 使用Spark SQL对压缩后MOR表读优化查询和快照查询
1 | docker exec -it adhoc-1 /bin/bash |
(11) 使用Presto对压缩后MOR表读优化查询
1 | docker exec -it presto-worker-1 presto --server presto-coordinator-1:8090 |
4 测试Hudi
当前组件版本Hadoop2.8.4、Hive2.3.3和Spark2.4.4.
1 | -- 启动包含Hadoop、Hive和Spark的Docker环境 |
(1) 构建本地Docker容器
docker/compose/docker-compose_hadoop284_hive233_spark244.yml保证了本地jar覆盖内建jar。
ocker/build_local_docker_images.sh构建本地docker镜像。